package com.smartwrite.entity;

import com.smartwrite.enums.TaskStatus;
import lombok.Getter;

import java.time.Instant;
import java.util.Map;

/**
 * 任务信息实体类
 * 存储任务的完整信息和状态
 */
@Getter
public class TaskInfo {

    // Getter和Setter方法
    private String taskId;                    // 任务ID
    private TaskStatus status;                // 任务状态枚举
    private String prompt;                    // 用户输入的提示词
    private String model;                     // 使用的模型
    private Boolean enableSearch;             // 是否启用搜索
    private String searchEngine;              // 搜索引擎类型
    private Map<String, String> apiKeys;      // API密钥映射
    private Instant startTime;                // 开始时间
    private Instant endTime;                  // 结束时间
    private String result;                    // 生成结果
    private String error;                     // 错误信息
    private String taskDir;                   // 任务目录路径
    private Process process;                  // 执行进程(运行时)
    
    // 构造函数
    public TaskInfo() {}
    
    public TaskInfo(String taskId) {
        this.taskId = taskId;
        this.status = TaskStatus.PENDING;
        this.startTime = Instant.now();
    }

    public void setTaskId(String taskId) {
        this.taskId = taskId;
    }

    public void setStatus(TaskStatus status) {
        this.status = status;
        // 如果任务完成或出错，设置结束时间
        if (status.isTerminal()) {
            this.endTime = Instant.now();
        }
    }
    
    // 为了兼容性，保留字符串设置方法
    public void setStatus(String statusCode) {
        this.setStatus(TaskStatus.fromCode(statusCode));
    }
    
    // 获取状态代码（用于API返回）
    public String getStatusCode() {
        return status != null ? status.getCode() : null;
    }

    public void setPrompt(String prompt) {
        this.prompt = prompt;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public void setEnableSearch(Boolean enableSearch) {
        this.enableSearch = enableSearch;
    }

    public void setSearchEngine(String searchEngine) {
        this.searchEngine = searchEngine;
    }

    public void setApiKeys(Map<String, String> apiKeys) {
        this.apiKeys = apiKeys;
    }

    public void setStartTime(Instant startTime) {
        this.startTime = startTime;
    }

    public void setEndTime(Instant endTime) {
        this.endTime = endTime;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public void setError(String error) {
        this.error = error;
    }

    public void setTaskDir(String taskDir) {
        this.taskDir = taskDir;
    }

    public void setProcess(Process process) {
        this.process = process;
    }

    /**
     * 获取任务执行时长(毫秒)
     */
    public Long getDuration() {
        if (startTime == null) return null;
        Instant end = endTime != null ? endTime : Instant.now();
        return end.toEpochMilli() - startTime.toEpochMilli();
    }
    
    /**
     * 检查任务是否已完成
     */
    public boolean isCompleted() {
        return status != null && status.isTerminal();
    }
    
    /**
     * 检查任务是否正在运行
     */
    public boolean isRunning() {
        return status != null && status.isActive();
    }
}